package com.security.lambda.function;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

/**
 * Function -> 接受一个泛型T，返回一个泛型R
 *
 * @author roger
 * @email 190642964@qq.com
 * @create 2017-11-09 10:28
 **/
public class Main {

    /**
     * 接收list，并返回另一个list
     *
     * @param list 接收的list
     * @param f    需要返回的表达式
     * @param <T>  接收集合的类型
     * @param <R>  返回集合的类型
     * @return 返回的数据
     */
    public static <T, R> List<R> map(List<T> list, Function<T, R> f) {
        List<R> result = new ArrayList<>();
        for (T s : list) {
            result.add(f.apply(s));
        }
        return result;
    }

    public static void main(String[] args) {

        // 接收一个List<String>,并返回这个list的所有元素的length
        List<Integer> l = map(Arrays.asList("function", "array", "length"), (String s) -> s.length());
        l.stream().forEach(integer -> System.out.println(integer));

        // 接收一个List<FunctionEntityOld>，将name和alia拼接后返回一个新的List<FunctionEntityNew>
        List<FunctionEntityOld> functionEntityOld = new ArrayList<>();
        functionEntityOld.add(new FunctionEntityOld("罗杰", "roger"));
        functionEntityOld.add(new FunctionEntityOld("蒲", "pu"));

        List<FunctionEntityNew> news = map(functionEntityOld, (FunctionEntityOld old) -> new FunctionEntityNew(old.getName() + "-" + old.getAlia()));
        news.stream().forEach(functionEntityNew -> System.out.println(functionEntityNew));

    }

}
